﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>



//<1>输入一个整数，判断它的奇偶性
//（1）方案1	
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	if (a % 2 == 1)//==是判断相等	=是赋值
//	{
//		printf("%d 是奇数",a);
//	}
//	else
//	{
//		printf("%d 是偶数",a);
//	}
//
//	return 0;
//}

//（2）方案2
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	if (a % 2)//根据if(表达式)中，表达式为真，打印if下的语句；表达式为假，打印else下的语句
//			  //当表达式中的结果为非0就是真，0就是假，因此可以不用==也可以判断
//	{
//		printf("%d 是奇数", a);
//	}
//	else
//	{
//		printf("%d 是偶数", a);
//	}
//
//	return 0;
//}



//<3>输入一个年龄，>=18岁就输出：成年，否则输出：未成年
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age >= 18)//可以不用空格隔开
//		printf("成年");//默认情况下if只能跟一条语句
//	
//	else
//		printf("未成年");//默认情况下else也只能跟一条语句
//	
//	return 0;
//}



//<4>if，else怎么跟多条语句
//int main()
//{
//	int age = 0;
//	printf("请输入年龄");//在if，else{}外打印，不管哪种情况都会显示
//	scanf("%d", &age);
//	if (age >= 18)//可以不用空格隔开
//	{//加上{}，也就是代码块，可以跟多条语句
//		printf("成年\n");//默认情况下（没有{}的情况下）if只能跟一条语句
//		printf("可以谈恋爱了\n");
//	}
//	else
//	{
//		printf("未成年\n");//默认情况下（没有{}的情况下）else也只能跟一条语句
//		printf("好好学习\n");
//	}
//	printf("都是人生的不同阶段\n");//如果我在if，else的{}外打印，不管哪种情况都会显示
// 
//	return 0;
//}



//<5>if，else嵌套语句（if中可以嵌套，else也可以）
			//输入一个整数，判断是0，正数还是负数
//（1）方案1
//int main()
//{
//	printf("请输入整数");
//	int a = 0;
//	scanf("%d", &a);
//	if (a == 0)
//	{
//		printf("%d 是0", a);
//	}
//	else//else语句中进行嵌套
//	{
//		if (a > 0)
//			printf("%d 是正数",a);
//		else
//			printf("%d 是负数",a);
//	}
//
//	return 0;
//}

//简化版
//int main()
//{
//	printf("请输入整数");
//	int a = 0;
//	scanf("%d", &a);
//	if (a == 0)
//	{
//		printf("%d 是0", a);
//	}
//	else if (a > 0)//把else嵌套语句外的{}删除
//			printf("%d 是正数",a);
//		else
//			printf("%d 是负数",a);
//
//	return 0;
//}

//（2）
//int main()
//{
//	printf("请输入一个整数");
//	int a = 0;
//	scanf("%d", &a);
//	if (a >= 0)
//	{
//		if (a == 0)
//			printf("%d 是0", a);
//		else
//			printf("%d 是一个正数", a);
//
//	}
//	else
//	{
//		printf("%d 是一个负数", a);
//	}
//
//	return 0;
//}

//简化版
//int main()
//{
//	printf("请输入一个整数");
//	int a = 0;
//	scanf("%d", &a);
//	if (a >= 0) if (a == 0)//删除if嵌套语句中的{}进行简化
//			printf("%d 是0", a);
//		else
//			printf("%d 是一个正数", a);
//
//	else
//	{
//		printf("%d 是一个负数", a);
//	}
//
//	return 0;
//}



//<6>使用嵌套函数不断嵌套完成下面题目
			//输⼊⼀个⼈的年龄
			//如果年龄 < 18岁，打印"少年"
			//	如果年龄在18岁⾄44岁打印"⻘年"
			//	如果年龄在45岁⾄59岁打印"中⽼年"
			//	如果年龄在60岁⾄89岁打印"⽼年"
			//	如果90岁及以上，打印"老寿星"
//int main()
//{
//	printf("请输入年龄");
//	int age = 0;
//	scanf("%d", &age);
//	if (age < 18)
//	{
//		printf("少年");
//	}
//	else
//	{
//		if (age <= 44)
//			printf("青年");
//		else
//		{
//			if (age <= 59)
//				printf("中老年");
//			else
//			{
//				if (age <= 89)
//					printf("老年");
//				else
//				{
//					printf("老寿星");
//				}
//			}
//		}
//	}
//
//	return 0;
//}

//简化版嵌套
//int main()
//{
//	printf("请输入年龄");
//	int age = 0;
//	scanf("%d", &age);
//	if (age < 18)
//			printf("少年");
//	else if (age <= 44)//else条件：>=18		if条件：<=44
//			printf("青年");
//	else if (age <= 59)//同理：45~59
//			printf("中老年");
//	else if (age < 89)//60~89
//			printf("老年");
//	else//	>=90
//			printf("老寿星");
//
//	return 0;
//}



//<7>悬空else问题：在没有大括号的情况下，如果有多个if和else语句，else总是跟最近的if语句匹配，成为同一结构
//int main()	 //在写语句时，该加大括号就要加，不要省略，但也要学会阅读省略大括号的语句
//{
//	int a = 0;
//	int b = 2;
//	if (a == 1)
//		if (b == 2)
//		printf("hehe\n");
//	else			//这里什么都不会打印，看似else与上面的if对齐匹配，上面的if没进去，应该打印下面的else
//					//但实际else是与最近的if也就是下面的if匹配，是一起位于最上面if的结构之下的
//					//最上面的if没进去，下面的if和else也不会有打印的机会
//		printf("haha\n");//如果有多个if和else语句，else总是跟最近的if语句匹配
//
//	 return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 2;
//	if (a == 1)
//		if (b == 2)
//			printf("hehe\n");
//		else//这里即使匹配上了，也不会有打印内容，因为在他们结构上层的if(a == 1)不符合条件
//			//不论else有没有与最近的if对齐，实际上都是与最近的if匹配
//			printf("haha\n");
//	return 0;
//}

//如果想让else匹配最上面的if，加个大括号
//int main()
//{
//	int a = 0;
//	int b = 2;
//	if (a == 1)
//	{
//		if (b == 2)
//			printf("hehe\n");
//	}//加个大括号，把else与最近的if语句隔开，从而与上面的if语句匹配
//	else
//		printf("haha\n");
//	return 0;
//}			//代码的结构清晰很重要，最好加上大括号



//<8>关系表达式通常返回0表示假，1表示真
//int main()
//{
//	int a = 5;			   //含关系运算符的是关系表达式
//	printf("%d\n", a == 6);//关系表达式打印时，通常打印1和0表示真假，而不是0和非0
//	printf("%d\n", a == 5);
//	printf("%d\n", a < 5);
//	printf("%d\n", a > 5);
//	printf("%d\n", a <= 5);
//	printf("%d\n", a >= 5);
//	printf("%d\n", a != 5);
//
//	return 0;
//}



//<9>区分判断相等和赋值
//			//判断a等不等于3，等于3才能打印
//int main()
//{
//	int a = 0;
//	if (a == 3)
//	{
//		printf("OK");//这里用判断相等，a不等于3，if()中的表达式为假，不打印
//	}
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	if (a = 3)//但如果我用的是赋值，那么默认就是a = 3，a = 3就为真，所以会打印，但是这不是我想要的结果
//	{		  //我的任务是判断a等不等于3，从而打不打印
//			  //而且这里不报错，要是忘写就容易出bug
//		printf("OK");
//	}
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	if (3 == a);//把常量放在前面，变量放在后面，如果只有赋值，就会报错，这样就容易检查到是否用的是判断相等
//	{
//		printf("OK");
//	}
//
//	return 0;
//}



//<10>多个关系操作符不能连用，否则不能带来想要的效果
//int main()
//{
//	int a = 5;
//	int b = 4;
//	int c = 10;
//	if (a < c < b)//5<10<4是不成立的，应该打印NO，但是打印了YES
//	{			  //因为a<c<b不是这样运算的，a<c即5<10成立，为真，表达式就变成了1，而1自然就小于b（4）
//				  //所以关系操作符不能连用
//		printf("YES");
//	}
//	else
//	{
//		printf("NO");
//	}
//
//
//	return 0;
//}

//那怎么样表达出a<c<b（5<10<4）的效果呢
//int main()
//{
//	int a = 5;
//	int b = 4;
//	int c = 10;
//	if (a < c && c < b)//加个并且符号，就可以表达出5<10<4的效果了
//	{
//		printf("YES");
//	}
//	else
//	{
//		printf("NO");
//	}
//
//
//	return 0;
//}

//⽐如：我们输⼊⼀个年龄，如果年龄在18岁~36岁之间，我们输出⻘年。
//int main()
//{
//	printf("请输入年龄");
//	int age = 0;
//	scanf("%d", &age);
//	/*if (18 <= age <= 36)*/	//如果用这行的if语句，则输入任何数都会打印青年，因为0和1怎么都小于36
//	if (18 <= age && age <= 36)
//		printf("青年");
//	return 0;
//}



//<11>三目操作符
			//a>5输出b=3，否则b=-3
//（1）方案1
//int main()
//{
//	int a = 0;
//	int b = 0;
//	printf("请输入一个值\n");
//	scanf("%d", &a);
//	if (a > 5)
//		b = 3;	//注：这里最好不要写成printf("b = 3")，这样代码就写死了
//	else
//		b = -3;
//	printf("%d\n", b);//前面b = 3,b = -3;写完后再以打印整型的格式打印b，这样代码更灵活
//
//	return 0;
//}

//（2）方案2
//int main()
//{
//	int a = 0;
//	int b = 0;
//	printf("请输入一个值");
//	scanf("%d", &a);
//	b = (a > 5 ? 3 : -3);//利用三目操作符就会更简便
//	//b = (a > 5 ? 2+1 : -3);//注：这里2+1表达式会自动计算
//	printf("%d\n", b);
//
//	return 0;
//}

//使⽤条件表达式实现找两个数中较大值
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int m = 0;
//	printf("请输入两个数");
//	scanf("%d%d", &a, &b);
//	m = (a > b ? a : b);
//	printf("%d\n", m);
//
//
//	return 0;
//}



//<12>逻辑取反运算符！
//int main()
//{
//	int flag = 0;//注：变量要初始化，没有初始化的变量直接打印是随机值，再VS上还不能打印，会报错
//				 //除全局变量外，全局变量没有初始化直接打印，会打印出0
//	if (!flag)//!就是把真的表达式变成假的，假的表达式变成真的
//			  //把非0变成0，把0变成1（注：这里不是把0变成非0，而是1）
//		printf("YES");
//
//	return 0;
//}



//<13>逻辑与运算符&&（适合只有一个范围）
			//说⽉份是3⽉到5⽉，是春天，那使⽤代码怎么体现呢
//int main()
//{
//	int month = 0;
//	printf("请输入一个月份");
//	scanf("%d", &month);
//	if (3 <= month && month <= 5)//&&两边的表达式都为真，整个表达式才为真，否则为假
//		printf("春季");
//
//	return 0;
//}



//<14>逻辑或运算符||（适合有多个范围）
		//我们说⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天，那么我们怎么使⽤代码体现呢？
//int main()
//{
//	int month = 0;
//	printf("请输入一个月份");
//	scanf("%d", &month);
//	if (month == 12 || month == 1 || month == 2)//整个表达式中只要有一个表达式为真，整个表达式就是真
//				//这里用不了&&，因为这里要划两个范围，两个范围不可能同时成立
//		printf("冬季");			
//
//	return 0;
//}



//<15>判断闰年
			//闰年的判断规则：普通闰年，能被4整除，且不能被100整除
							//世纪闰年，能被400整除
//（1）方案1
//int main()
//{
//	int year = 0;
//	printf("请输入年份");
//	scanf("%d", &year);
//	if (year % 4 == 0)
//	{
//		if (year % 100 != 0)
//			printf("普通闰年");
//	}
//	//else//因为if，else语句不是进入if就是进入else，只能进入一个
//		//但是输入2000年，这是世纪闰年，它有if和else的共性条件，先进入了if，但最后又不符合普通闰年条件
//		//但又不会再进入else，不会被判断为世纪闰年，这里就出错了
//		//这时把else删掉，留if语句与最外面的if语句并列，意思是可以都可以进入，先进入你，你不行，再进入我
//		if (year % 400 == 0)
//			printf("世纪闰年");
//
//
//	return 0;
//}

//（2）方案2
//int main()
//{
//	int year = 0;
//	printf("请输入年份");
//	scanf("%d", &year);
//	if ((year % 4 == 0) && (year % 100 != 0))
//	{
//	//if (year % 100 != 0)//把里面的if语句中的条件移到外面的if语句中，利用&&表示普通闰年的条件
//  //这样就能一次性把普通闰年的条件检测完，从而能够发挥else的价值
//		
//			printf("普通闰年");
//	}
//	else
//		if (year % 400 == 0)
//			printf("世纪闰年");
//
//
//	return 0;
//}

//（3）方案3
//int main()
//{
//	int year = 0;
//	printf("请输入一个年份");
//	scanf("%d", &year);
//	if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))//不论是普通闰年还是世纪闰年，只要有一个
//		//是闰年，就是闰年，符合逻辑或运算，只要满足至少一个为真，就是真（实际上只有世纪闰年和普通闰年只能有
//		//一个成立，不会两个都成立；并且这里可以用&&来满足普通闰年的条件
//		printf("闰年");
//
//
//	return 0;
//}



//<16>短路运算（短路的本质是后面的表达式真假已经不能改变整体的真假，没有意义去计算）
//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;	
//						  //&&要求全部为真，只要遇到假的就短路了
//	i = a++ && ++b && d++;//a++先使用，a=0,为假，再++，a=1，那么对应的整体a++&&++b也为假（因为&&要同时为真）
//						  //a=0为假，不能全部为真，短路，所以++b和d++不会计算，b=2，d=4
//						  // a=0,为假，对应的整体a++&&++b也为假
//						  //那么a++&&++b对应的整体a++&&++b&&d++也为假，所以a++&&++b&&d++为0，所以i为0
//		
//	//i = a++||++b||d++;
//	//||要求至少一个为真就可以，只要遇到一个真的就短路了
//	//a++先使用，a=0为假，不为真，后计算a=1，没短路，继续计算
//	//++b先++，b=3，后使用，为真，短路
//	//短路后，d++不计算，d=4
//	//++b部分为真，则对应的整体a++||++b为真
//	//a++||++b为真，则对应的整体a++||++b||d++为真
//	//则i为真，i=1
//	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
//	printf("i = %d\n", i);
//	return 0;
//}

//int main()
//{
//	int i = 0, a = 1, b = 2, c = 3, d = 4;
//						  //&&要求全部为真，遇到假的就短路了
//	//i = a++ && ++b && d++;//a++先使用，a=1，为真，再计算，a=2，并继续计算
//						  //++b先计算，b=3，在使用，为真
//						  //d++先使用，为真，再计算，d=5
//						  //a++ && ++b为真，d++也为真，那么对应的整体a++ && ++b && d++也为真，所以i为真，i=1
//	i = a++||++b||d++;
//	//||要求至少一个为真就可以，遇到真的就短路了
//	//a++先使用，a=1，为真，短路，再计算，a=2
//	//++b，d++不计算，b=2,d=4
//	//a=1为真，对应的a++||++b为真，
//	//a++||++b为真，对应的a++||++b||d++为真，所以i为真，i=1
//	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
//	printf("%d\n", i);
//
//	return 0;
//}



//<17>输⼊任意⼀个整数值，计算除3之后的余数
//（1）方案1	if，else语句
//int main()
//{
//	printf("请输入一个整数");
//	int a = 0;
//	scanf("%d", &a);
//	if (a % 3 == 0)
//	{
//		printf("整除了，余数是0");
//	}
//	else
//	{
//		if (a % 3 == 1)
//			printf("没整除，余数是1");
//		else
//		{
//			printf("没整除，余数是2");
//		}
//	}
//
//	return 0;
//}

//（2）方案2	switch语句
//int main()
//{
//	printf("请输入一个整数");
//	int a = 0;
//	scanf("%d", &a);
//	switch (a % 3)//switch语句适合在有有限的，精确的数值使用
//	{
//	case 0://case后的数值不是顺序值，而是switch语句中能够精确计算的结果
//		   //switch语句的结果是多少，就进入有相应数值的case语句
//		printf("整除了，余数是0");
//		break;//break是阻止继续执行以下的case语句，选择跳出switch语句
//	case 1:
//		printf("没整除，余数是1");
//		break;
//	case 2 :
//		printf("没整除，余数是2");
//		break;
//
//
//	}
//
//	return 0;
//}

//练习
//输⼊⼀个1~7的数字，打印对应的星期⼏
//例如：
//输⼊：1 输出：星期⼀
//输⼊：2 输出：星期⼆
//输⼊：3 输出：星期三
//输⼊：4 输出：星期四
//输⼊：5 输出：星期五
//输⼊：6 输出：星期六
//输⼊：7 输出：星期天
//int main()
//{
//	printf("请输入一个1~7的数值");
//	int a = 0;
//	scanf("%d", &a);
//	switch (a)
//	{
//	case 1:
//		printf("星期一");
//		break;
//	case 2:
//		printf("星期二");
//		break;
//	case 3:
//		printf("星期三");
//		break;
//	case 4:
//		printf("星期四");
//		break;
//	case 5:
//		printf("星期五");
//		break;
//	case 6:
//		printf("星期六");
//		break;
//	case 7:
//		printf("星期七");
//		break;
//	default :
//		printf("星期%d不存在", a);
//	}
//
//	return 0;
//}

//练习
// 输⼊1-5，输出的是“⼯作⽇”;
// 输⼊6-7，输出“休息⽇”
//int main()
//{
//	printf("请输入一个1~7的值");
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//		printf("工作日");
//		break;
//	case 2:
//		printf("工作日");
//		break; 
//	case 3:
//		printf("工作日");
//		break; 
//	case 4:
//		printf("工作日");
//		break; 
//	case 5:
//		printf("工作日");
//		break; 
//	case 6:
//		printf("休息日");
//		break; 
//	case 7:
//		printf("休息日");
//		break;
//	default :
//		printf("不存在星期%d", day);
//		break;
//
//	}
//
//	return 0;
//}

//但是上面的代码太冗长了
//int main()
//{
//	printf("请输入一个1~7的值");
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//	case 2:
//	case 3:
//	case 4:
//	case 5://case5个语句共用一个“工作日”
//		printf("工作日");
//		break;//巧用break分范围执行多个case语句，在跳出switch语句，解决冗长问题
//	case 6:
//	case 7://case2个语句共用一个“休息日”
//		printf("休息日");
//		break;
//	default://默认的意思：用来处理case语句都不存在的情况
//		printf("不存在星期%d", day);
//		break;
//
//	}
//
//	return 0;
//}



//<18>while死循环
//int main()
//{
//	int i = 1;
//	while (i)//while中的表达式结果只要为真，就会一直打印
//			 //直到表达式结果为假或表达式本身不成立了，才会结束打印
//	{
//		printf("YES");
//	}
//
//	return 0;
//}

//练习：在屏幕上打印 1~10 的值
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		printf("%d ", i);
//		i++;
//
//	}
//
//}

//练习：输⼊⼀个正的整数，逆序打印这个整数的每⼀位
//例如：
//输⼊：1234，输出：4 3 2 1
//输⼊：521，输出：1 2 5
//int main()
//{
//	printf("请输入一个整数");
//	int i = 0;
//	scanf("%d", i);
//	while (i)
//	{
//		printf("%d ", i % 10);//获取每个数的最低位
//		i = i / 10;//逆序整理出数的每个位
//	}
//
//	return 0;
//}